package com.yanchengtect.demo.progress.utils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author 文心雕龙 Email：xuwenlong@shike8888.com
 * @version 创建时间：2017年5月2日 下午5:42:39 类说明
 */
public class YCDateUtils {

	/**
	 * 根据指定的时分秒获取详细的时间
	 * @param hour 时
	 * @param min  份
	 * @param seconds 秒
	 * @return date
	 */
	public static Date getDetailTime(Integer hour, Integer min, Integer seconds) {
		Calendar instance = Calendar.getInstance();
		return getDateDetail(instance, hour, min, seconds);

	}

 
	
	/**
	 * 将指定的时间转换成时间戳(Long类型)
	 * @param date 日期
	 * @param hour 时
	 * @param min 分
	 * @param seconds 秒
	 * @return long类型的时间戳
	 */
	public static Long toDayLong(Date date, Integer hour, Integer min, Integer seconds) {

		Calendar instance = Calendar.getInstance();
		instance.setTime(date);
		return getDateDetail(instance, hour, min, seconds).getTime();
	}

	
	
	/**
	 * 计算两个日期之间的天数差值
	 * @param before 前一个日期
	 * @param after 后一个日期
	 * @return 差值
	 */
	public static int diffDayBetweenTwoDate(Date before, Date after) {
		Calendar instance = Calendar.getInstance();
		instance.setTime(before);
		Date before_0 = getDateDetail(instance, 0, 0, 0);
		instance.setTime(after);
		Date after_0 = getDateDetail(instance, 0, 0, 0);
		return differentDaysByMillisecond(before_0, after_0);
	}

	
	
	/**
	 * 获取相对今天dayNum天的某个时间
	 * @param dayNum ： 大于零 今天之后的dayNum天；小于零今天之前的dayNum天
	 * @param hour 时
	 * @param min 份
	 * @param seconds 秒
	 * @return
	 */
	public static Date distanceFromTodaDetailTime(Integer dayNum, Integer hour, Integer min, Integer seconds) {
		Calendar instance = Calendar.getInstance();
		instance.add(Calendar.DATE, dayNum);
		return getDateDetail(instance, hour, min, seconds);
	}

	public static void main(String[] args) {
		System.out.println(YCDateUtils.dayLaterOneDay(YCDateUtils.getDetailTime(23, 59, 59), 6));
	}
	
	
	/**
	 * 获取相对当前时间dayNum天的某个时间
	 * @param dayNum ： 大于零 今天之后的dayNum天；小于零今天之前的dayNum天
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static Date distanceFromNowDetailTime(Integer dayNum) {
		Calendar instance = Calendar.getInstance();
		instance.add(Calendar.DATE, dayNum);
		Date now = new Date();
		return getDateDetail(instance, now.getHours(), now.getMinutes(), now.getSeconds());
	}

	
	/**
	 * 获取指定日期和时分秒的时间
	 * @param instance 日期
	 * @param hour 时
	 * @param min 分
	 * @param seconds 秒
	 * @return date类型的时间
	 */
	private static Date getDateDetail(Calendar instance, Integer hour, Integer min, Integer seconds) {
		instance.set(Calendar.HOUR_OF_DAY, hour);
		instance.set(Calendar.SECOND, seconds);
		instance.set(Calendar.MINUTE, min);
		instance.set(Calendar.MILLISECOND, 0);
		return instance.getTime();
	}

	
	
	/**
	 * 获取当前时间加上 minute 分钟后的时间，minute 可以为负，获取几分钟以前的时间
	 * @author wlf
	 * @param minute  需要变化的分数
	 * @return Date 类型的时间
	 */
	public static Date minuteLaterDate(Integer minute) {

		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MINUTE, minute);

		return calendar.getTime();
	}

	
	/**
	 * 通过时间秒毫秒数判断两个时间的间隔多少天 subfrom -sub 20171010-20171010 得到 0 天
	 * @param sub  减数
	 * @param subfrom 被减数
	 * @return
	 */
	public static Integer differentDaysByMillisecond(Date sub, Date subfrom) {
		int days = (int) ((subfrom.getTime() - sub.getTime()) / (1000 * 3600 * 24));
		return days;
	}
	

	
	/**
	 * 获取几天后的日期，
	 * @param daynum  天数
	 * @return
	 */
	public static Date dayLaterDate(Integer daynum) {

		Calendar instance = Calendar.getInstance();
		instance.add(Calendar.DATE, daynum);
		return instance.getTime();
	}

	
	
	/**
	 * 对指定的时间进行格式化
	 * @param date  时间
	 * @return
	 */
	public static String formatDate(Date date) {
		return formatDate(date, null);
	}

	
	
	/**
	 * 对指定的时间进行格式化
	 * @param date  时间
	 * @param format  格式
	 * @return
	 */
	public static String formatDate(Date date, String format) {

		format = null == format ? "yyyy-MM-dd HH:mm:ss" : format;
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(date);
	}

	
	
	/**
	 * 获取指定某天的0点
	 * @param thisDay  指定的某天
	 * @return
	 */
	public static Date thisDayZeroOclock(Calendar thisDay) {

		thisDay.set(Calendar.HOUR_OF_DAY, 0);
		thisDay.set(Calendar.SECOND, 0);
		thisDay.set(Calendar.MINUTE, 0);
		thisDay.set(Calendar.MILLISECOND, 0);
		return thisDay.getTime();
	}

	
	
	/**
	 * 获取当天的0点
	 * @return
	 */
	public static Date todayZeroOclock() {
		Calendar thisDay = Calendar.getInstance();
		thisDay.set(Calendar.HOUR_OF_DAY, 0);
		thisDay.set(Calendar.SECOND, 0);
		thisDay.set(Calendar.MINUTE, 0);
		thisDay.set(Calendar.MILLISECOND, 0);
		return thisDay.getTime();
	}

	
	
	/**
	 * 获取指定某个时间之后的几天
	 * @param thisDay 指定的时间
	 * @return
	 */
	public static Date dayLaterOneDay(Date date, Integer daynum) {
		Calendar instance = Calendar.getInstance();
		instance.setTime(date);
		instance.add(Calendar.DATE, daynum);
		return instance.getTime();
	}

   
   /**
    * 根据年月日时分秒初始化一个Date对象
    * @param dayOfMonth 日
    * @param month 月
    * @param year 年
    * @param hour 时
    * @param min 分
    * @param seconds 秒
    * @return
    */
   public static Date initDate(int dayOfMonth,int month,int year,int hour,int min,int seconds) {
	   Calendar instance = Calendar.getInstance();
		instance.set(Calendar.DATE, dayOfMonth);
		instance.set(Calendar.MONTH, (month-1));
		instance.set(Calendar.YEAR, year);
		instance.set(Calendar.HOUR_OF_DAY, hour);
		instance.set(Calendar.MINUTE, min);
		instance.set(Calendar.SECOND, seconds);
		return instance.getTime();
   }
   
   
   /**
    * 根据年月日初始化一个Date对象，时分秒默认为0
    * @param dayOfMonth 日
    * @param month 月
    * @param year 年
    * @return
    */
   public static Date initDate(int dayOfMonth,int month,int year) {
	   return initDate(dayOfMonth,month,year,0,0,0);
   }

	//本月第一天
	public static Date getThisMonthFirstDayDate() {

		Calendar c = Calendar.getInstance();
		c.add(Calendar.MONTH, 0);
		c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
		Date dateDetail = getDateDetail(c, 0, 0, 0);
		return dateDetail;
	}
   
   
}
